#include<stdio.h>
#include<pthread.h>
#include<modbus.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include<errno.h>
#include "shmem.h"
#include "msg_queue_peer.h"
 #include "shmem.h"
static struct shm_param para;

struct msgbuf
{  // int flag;
    int mtype;
    char mdata[256];
};

union val_t
{ 
    int b_val;  //bool类型存储空间
    int i_val;   //整形值存储空间
    float f_val;  //浮点值存储空间
};

struct student
{
    char str[64]; //可以存放所有字符型
    int key;  //唯一键值
    int type;  //数据点类型
    int dev_type;  //数据点属于哪个设备，根据网关支持的设备自行定义
    union val_t old_val;  //变化上报后需要更新旧值
    union val_t new_val;  //从共享内存取出最新数据，放到new_val中
    int ret;  //默认为-1，采集成功后设置为0，采集失败再置-1
};

static int *total;  //指向共享内存中数据节点总个数
static struct student *node_arr;  //指向共享内存中节点缓存数组头

#define MAX_NODE 50  //最大支持学生数目
#define STD_NODE_LEN sizeof(struct student)
#define MAX_NODE_SIZE (MAX_NODE * STD_NODE_LEN)

 uint16_t dest[64];
// struct msgbuf
// {
//     long type;
//     int num;
//     char ch;
// };
// struct msgbu
// {
//     long type;
//     int num;
//     int nu;
// };
struct msgbuf recv_buf;
modbus_t*  ctx;
void *creat(void *agg)
{  
 while(1)
 { 
   if(msg_queue_recv("topic", &recv_buf, sizeof(recv_buf), 0, 0) > 0)
        {
 printf("recv from msga type = %d\n", recv_buf.mtype);
             printf("recv from msga data = %s\n", recv_buf.mdata);
        
      if (recv_buf.mtype==node_arr[19].key)
      {
    if (!strcmp(recv_buf.mdata,"ON"))
    {
    modbus_write_bit(ctx,0,1);
    node_arr[19].type=1;
    printf("LED 打开\n");
    }
    else if(!strcmp(recv_buf.mdata,"OFF"))
    {
    modbus_write_bit(ctx,0,0);
     printf("LED 关闭\n");
    }
      }

       if (recv_buf.mtype==node_arr[20].key)
{ 
   if (!strcmp(recv_buf.mdata,"ON"))
    {
       modbus_write_bit(ctx,1,1);
        printf("蜂鸣器 打开\n");
    }
    else if(!strcmp(recv_buf.mdata,"OFF"))
    {
    modbus_write_bit(ctx,1,0);
     printf("蜂鸣器 关闭\n");
    }
  
  }
}
}
}
void *create(void *agg)
{


    int ret = -1;

    ret = shm_init(&para, "shm_test", MAX_NODE_SIZE);
    if(ret < 0)
    {
        return -1;
    }


    void *node_p = shm_getaddr(&para);
    if(node_p == NULL)
    {
        return -1;
    }

    //前4个字节存储实际的学生数目
    total = (int *)node_p;
    //后面空间存储数据点
    node_arr = (struct student *)(node_p + sizeof(int));

    // node_arr[16].new_val.i_val=100;
    // printf("%d\n",node_arr[16].new_val.i_val);
    
    
     while(1)
 {   
   modbus_read_registers(ctx,0,4,dest);
   
   node_arr[16].new_val.f_val=dest[0];
      node_arr[17].new_val.f_val=dest[1];
       node_arr[18].new_val.f_val=dest[2];
       node_arr[19].new_val.f_val=dest[3];
        // printf("%d\n",node_arr[17].new_val.i_val);
       // sprintf(p, "光:%dx:%dy:%dz:%d\n", dest[0], dest[1], dest[2], dest[3]);
        //sleep(5);
        // printf("%d %d %d %d\n", dest[0], dest[1], dest[2], dest[3]);
        // printf("%s\n",p);
 }
}
int main(int argc, char const *argv[])
{
     ctx= modbus_new_tcp("192.168.1.247",502);
     modbus_set_slave(ctx,1);
     
       if( modbus_connect(ctx)<0)
  {
    perror("connect err:");
    
  }
    pthread_t pid;
    pthread_create(&pid,NULL,creat,NULL);
 pthread_t pd;
    pthread_create(&pd,NULL,create,NULL);
  
     pthread_join(pid,NULL);
     pthread_join(pd,NULL);
     modbus_close(ctx);
     modbus_free(ctx);
    return 0;
}
